Spring Cloud构建微服务架构 高可用

一、SpringCloud简介

Spring Cloud是一系列框架的有序集合。
它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。
Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。

二、微服务的注册与发现-Eureka

Eureka是Netflix开源的服务发现组件,本身是基于Rest的服务,它包含服务端和客户端两部分;在SpringCloud中将它集成在其中,从而实现了微服务的发现与注册;

Eureka Server可以运行多个实例来构建集群,解决单点问题,Eureka Server采用的是Peer to Peer对等通信。这是一种去中心化的架构,无master/slave区分,每一个Peer都是对等的。在这种架构中,节点通过彼此互相注册来提高可用性,每个节点需要添加一个或多个有效的serviceUrl指向其他节点。每个节点都可被视为其他节点的副本。

如果某台Eureka Server宕机,Eureka Client的请求会自动切换到新的Eureka Server节点,当宕机的服务器重新恢复后,Eureka会再次将其纳入到服务器集群管理之中。当节点开始接受客户端请求时,所有的操作都会进行replicateToPeer(节点间复制)操作,将请求复制到其他Eureka Server当前所知的所有节点中。

简单来说,Eureka Server的高可用,实际上就是将自己也作为服务向其他服务注册中心进行注册,这样就可以形成一组相互注册的服务注册中心,以实现服务清单的互相同步,达到高可用的效果。

集群模式下,Eureka的架构图:
image
Eureka Server

- 服务端-没有存储,内存保持,每服务实例需要发送心跳去续约 
- 客户端-在内存中缓存着eureka的注册信息,因此不必每请求到eureka查找服务 
- eureka之间会做注册服务同步,从而保证状态一致,客户端只需访问一个

eureka Service Provider

- 会向Eureka Server做Register(服务注册)、Renew(服务续约)、Cancel(服务下线)等操作 

Service Consumer

- 会向Eureka Server获取注册服务列表,并消费服务

三、Eureka的高可用

eureka 项目下复制application.properties
分别命名为:

application-server1.properties, application-server2.properties, application-server3.properties

修改hosts文件:

127.0.0.1    localhost server1 server2 server3

application-server1.properties的配置文件:

server.port=1001
spring.application.name=eureka-server-1
spring.profiles.active=server1
#表示是否将自己注册在EurekaServer上,默认为true。由于当前应用就是EurekaServer,所以置为false
eureka.client.register-with-eureka=true
#表示表示是否从EurekaServer获取注册信息,默认为true。单节点不需要同步其他的EurekaServer节点的数据
#eureka.client.fetch-registry=false
#指定主机名
eureka.instance.hostname=server1
eureka.client.serviceUrl.defaultZone=http://server2:1002/eureka/,http://server3:1003/eureka/

application-server2.properties的配置文件:

server.port=1002
spring.application.name=eureka-server-2
spring.profiles.active=server2
#表示是否将自己注册在EurekaServer上,默认为true。由于当前应用就是EurekaServer,所以置为false
eureka.client.register-with-eureka=true
#表示表示是否从EurekaServer获取注册信息,默认为true。单节点不需要同步其他的EurekaServer节点的数据
#eureka.client.fetch-registry=false
#指定主机名
eureka.instance.hostname=server2
eureka.client.serviceUrl.defaultZone=http://server1:1001/eureka/,http://server3:1003/eureka/

application-server3.properties的配置文件:

server.port=1003
spring.application.name=eureka-server-3
spring.profiles.active=server3
#表示是否将自己注册在EurekaServer上,默认为true。由于当前应用就是EurekaServer,所以置为false
eureka.client.register-with-eureka=true
#表示表示是否从EurekaServer获取注册信息,默认为true。单节点不需要同步其他的EurekaServer节点的数据
#eureka.client.fetch-registry=false
#指定主机名
eureka.instance.hostname=server3
eureka.client.serviceUrl.defaultZone=http://server1:1001/eureka/,http://server2:1002/eureka/

compute-service 项目下复制application.properties 为: application-dev.properties
配置信息:

spring.application.name=compute-service
server.port=2001
eureka.client.serviceUrl.defaultZone=http://server3:1003/eureka/,http://server1:1001/eureka/,http://server2:1002/eureka/

分别启动服务端server3、server2、server1、compute-service

# 分别在项目下 执行 mvn clean install  命令编译 生成 target
 mvn clean install

# 在 /SpringCloudDemo/eureka/target 下执行,启动

java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=server1
java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=server2
java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=server3

# 在 /SpringCloudDemo/compute-service/target 下执行,启动
java -jar compute-service-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev

访问,http://localhost:1001/http://localhost:1002/http://localhost:1003/,如下:
image
image
image

该工程可参见:SpringCloudDemo/eureka

至此,完成了Eureka的高可用;